package com.huawei.statistics.service.common;



import java.util.List;
import java.util.Map;

/**
 * Created by 许湛司 on 2017/4/20.
 */
public interface BaseService {
    /**
     * 公共的添加数据 并返回实体
     *
     * @param params
     * @return
     */
    <T> T addEntity(Map<String, Object> params, Class<T> clazz);

    /**
     * 公共的添加数据
     *
     * @param o
     * @return
     */
    boolean addEntity(Object o);

    /**
     * 批量新增
     * @param obj
     * @param <T>
     * @return
     */
    <T> boolean bactchInsert(List<T> obj);
    /**
     * 批量删除
     * @param obj
     * @param <T>
     * @return
     */
    <T> boolean bactchDelete(List<T> obj);


    /**
     * 添加数据后返回主键id
     *
     * @param o
     * @return
     */
    Long addEntityReturnId(Object o);

    /**
     * 公共的修改
     *
     * @param params
     * @param clazz
     * @return
     */
    boolean modifyEntityById(Map<String, Object> params, Class<?> clazz, Integer id);

    /**
     * 公共的删除
     *
     * @param id
     * @param clazz
     * @return
     */
    boolean deleteEntityById(Long id, Class<?> clazz);

    /**
     * 公共的根据id和表找到实体
     *
     * @param id
     * @param clazz
     * @return
     */
    <T> T getEntityById(Long id, Class<T> clazz);

    /**
     * 更新或者保存一个实体
     *
     * @param params
     * @return
     */
    boolean saveOrUpdateEntity(Map<String, Object> params, Class<?> clazz);

    /**
     * 更新或者保存一个实体
     *
     * @param obj
     * @return
     */
    boolean saveOrUpdateEntity(Object obj);

    /**
     * 更新实体的部分值
     * @param obj
     * @return
     */
    boolean updateEntityValues(Object obj);

    /**
     * 更新实体
     * @param clazz
     * @param columns
     * @param condition
     * @return
     */
    boolean updateEntity(Class<?> clazz, Map<String, Object> columns, Map<String, Object> condition);

    /**
     * 获取所有的实体
     *
     * @param clazz
     * @param <T>
     * @return
     */
    <T> List<T> loadAllEntity(Class<T> clazz);

    /**
     * 删除一个实体（带级联效果）
     *
     * @param o
     * @return
     */
    boolean deleteEntity(Object o);

    /**
     * 根据map删除实体
     * @param clazz
     * @param condition
     * @param <T>
     * @return
     */
    <T> boolean deleteByMap(Class<T> clazz, Map<String, Object> condition);

    /**
     * 根据一个字段去删除
     * @param clazz
     * @param column
     * @param val
     * @param <T>
     * @return
     */
    <T> boolean deleteByOneProperty(Class<T> clazz, String column, Object val);

    /**
     * 根据一个节点属性值找到实体（获取单个）
     *
     * @param clazz
     * @param propertyName
     * @param val
     * @param <T>
     * @return
     */
    <T> T getEntityByOneProperty(Class<T> clazz, String propertyName, Object val);

    /**
     * 根据一个节点属性值找到实体(获取多个)
     *
     * @param clazz
     * @param propertyName
     * @param val
     * @param <T>
     * @return
     */
    <T> List<T> getEntitiesByPropertyName(Class<T> clazz, String propertyName, Object val);

    /**
     * 获取某个实体的总数
     *
     * @param clazz
     * @return
     */
    int getEntityCount(Class<?> clazz);

    /**
     * 根据一个条件获取某个实体的总数
     *
     * @param clazz
     * @param propertyName
     * @param val
     * @return
     */
    int getEntityCountByPropertyName(Class<?> clazz, String propertyName, Object val);

    /**
     * 根据查询条件获取总数
     * @param clazz
     * @param condition
     * @return
     */
    int getCountByMap(Class<?> clazz, Map<String, Object> condition);

    /**
     * 根据多条件查询实体
     *
     * @param clazz
     * @param condition
     * @param <T>
     * @return
     */
    <T> List<T> getEntityByMap(Class<T> clazz, Map<String, Object> condition);

    /**
     * 根据多条件查询出单个实体
     * @param clazz
     * @param condition
     * @param <T>
     * @return
     */
    <T> T getUniqueEntityByMap(Class<T> clazz, Map<String, Object> condition);

    /**
     * 根据多条件查询查询所需字段
     *
     * @param clazz
     * @param params
     * @param condition
     * @param <T>
     * @return
     */
    <T> List<T> getEntityByMapEnclosureParams(Class<T> clazz, List<String> params, Map<String, Object> condition);

    /**
     * 根据实体类分页查询
     *
     * @param clazz     实体名称
     * @param condition 条件 可为空
     * @param start     起始页数
     * @param max       数量
     * @param <T>
     * @param descParam    是否倒序,倒序字段
     * @return
     */
    <T> List<T> findEntityByPage(Class<T> clazz, Map<String, Object> condition, int start, int max, Object descParam);

    /**
     * 查询排序后的实体
     *
     * @param clazz
     * @param condition
     * @param sortParam
     * @param isDesc
     * @param <T>
     * @return
     */
    <T> List<T> getEntitiesBySort(Class<T> clazz, Map<String, Object> condition, String sortParam, boolean isDesc);

    /**
     * 获取字段值的累加总数
     * @param clazz
     * @param condition 条件
     * @param param 需要计算的字段
     * @param <T>
     * @return
     */
    Integer getSum(Class<?> clazz, Map<String, Object> condition, Object param);
}
